home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1999 / MacHack 1999.toast / The Hacks / DesktopDoubler / Common / Sources / StringUtils.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-06-23  |  3.6 KB  |  274 lines  |  [TEXT/CWIE]

  1. #define DISABLE_LOCAL_CALLTRACE        1        // Set to 1 to disable Call Traces for this file.
  2. #define DISABLE_LOCAL_DEBUG            0        // Set to 1 to disable all debugging for this file.
  3. #include "DebugUtils.h"
  4.  
  5. #include <ctype.h>
  6. #include <Errors.h>
  7. #include <Resources.h>
  8. #include <string.h>
  9. #include <TextUtils.h>
  10. #include "StringUtils.h"
  11.  
  12.  
  13.  
  14.  
  15.  
  16. // Case insensitive version of strcmp(NoCase).
  17. int strcmpnc(const char *s1,const char *s2)
  18. {
  19.     int        c1,c2;
  20.     
  21.     
  22.     while(*s1 && *s2)
  23.     {
  24.         c1 = toupper(*s1++);
  25.         c2 = toupper(*s2++);
  26.         
  27.         if (c1 != c2)
  28.             return (c1 > c2) ? 1 : -1;
  29.     }
  30.     
  31.     if (!*s1 && !*s2)
  32.         return 0;
  33.     
  34.     if (!*s1)
  35.         return -1;
  36.     
  37.     if (!*s2)
  38.         return 1;
  39.     
  40.     return 0;
  41. }
  42.  
  43.  
  44.  
  45.  
  46.  
  47. // Case insensitive version of strncmp(NoCase).
  48. int strncmpnc(const char *s1,const char *s2,size_t n)
  49. {
  50.     int        c1,c2;
  51.     
  52.     
  53.     while((n > 0) && *s1 && *s2)
  54.     {
  55.         c1 = toupper(*s1++);
  56.         c2 = toupper(*s2++);
  57.         n--;
  58.         
  59.         if (c1 != c2)
  60.             return (c1 > c2) ? 1 : -1;
  61.     }
  62.     
  63.     if (n == 0)
  64.         return 0;
  65.     
  66.     if (!*s1)
  67.         return -1;
  68.     
  69.     if (!*s2)
  70.         return 1;
  71.     
  72.     return 0;
  73. }
  74.  
  75.  
  76.  
  77.  
  78.  
  79. // Pascal version of strcat.
  80. unsigned char *pstrcat(unsigned char *dst,const unsigned char *src)
  81. {
  82.     memmove(&dst[1 + dst[0]],&src[1],src[0]);
  83.     dst[0] += src[0];
  84.     return dst;    
  85. }
  86.  
  87.  
  88.  
  89.  
  90.  
  91. // Pascal version of strcpy.
  92. unsigned char *pstrcpy(unsigned char *dst,const unsigned char *src)
  93. {
  94.     memmove(dst,src,1 + src[0]);
  95.     return dst;
  96. }
  97.  
  98.  
  99.  
  100.  
  101.  
  102. // Pascal version of strncpy.
  103. unsigned char *pstrncpy(unsigned char *dst,const unsigned char *src,size_t n)
  104. {
  105.     unsigned char    len = (src[0] < n) ? src[0] : n;
  106.     
  107.     
  108.     memmove(&dst[1],&src[1],len);
  109.     dst[0] = len;
  110.     return dst;
  111. }
  112.  
  113.  
  114.  
  115.  
  116.  
  117. // Pascal version of strcmp.
  118. int pstrcmp(const unsigned char *s1,const unsigned char *s2)
  119. {
  120.     int    index,len = (s1[0] < s2[0]) ? s1[0] : s2[0];
  121.     
  122.     
  123.     for (index = 1;index <= len;index++)
  124.     {
  125.         if (s1[index] > s2[index])
  126.             return 1;
  127.         else if (s1[index] < s2[index])
  128.             return -1;
  129.     }
  130.     
  131.     if (s1[0] > s2[0])
  132.         return 1;
  133.     else if (s1[0] < s2[0])
  134.         return -1;
  135.     
  136.     return 0;
  137. }
  138.  
  139.  
  140.  
  141.  
  142.  
  143. // Case insensitive version of pstrcmp(NoCase).
  144. int pstrcmpnc(const unsigned char *s1,const unsigned char *s2)
  145. {
  146.     int        index,len = (s1[0] < s2[0]) ? s1[0] : s2[0];
  147.     int        c1,c2;
  148.     
  149.     
  150.     for (index = 1;index <= len;index++)
  151.     {
  152.         c1 = toupper(s1[index]);
  153.         c2 = toupper(s2[index]);
  154.         
  155.         if (c1 > c2)
  156.             return 1;
  157.         else if (c1 < c2)
  158.             return -1;
  159.     }
  160.     
  161.     if (s1[0] > s2[0])
  162.         return 1;
  163.     else if (s1[0] < s2[0])
  164.         return -1;
  165.     
  166.     return 0;
  167. }
  168.  
  169.  
  170.  
  171.  
  172.  
  173. // Convert C to Pascal string.
  174. unsigned char *ctopstr(unsigned char *dst,const char *src)
  175. {
  176.     unsigned char    len = strlen(src);
  177.     
  178.     
  179.     memmove(&dst[1],src,len);
  180.     dst[0] = len;
  181.     return dst;
  182. }
  183.  
  184.  
  185.  
  186.  
  187.  
  188. // Convert Pascal to C string.
  189. char *ptocstr(char *dst,const unsigned char *src)
  190. {
  191.     unsigned char    len = src[0];
  192.     
  193.     
  194.     memmove(dst,&src[1],len);
  195.     dst[len] = '\0';
  196.     return dst;
  197. }
  198.  
  199.  
  200.  
  201.  
  202.  
  203. char *GetCString(char *str,short strID)
  204. {
  205.     return ptocstr(str,(StringPtr)GetPString((StringPtr)str,strID));
  206. }
  207.  
  208.  
  209.  
  210.  
  211.  
  212. StringPtr GetPString(StringPtr str,short strID)
  213. {
  214.     Handle    data;
  215.     
  216.     
  217.     data = Get1Resource('STR ',strID);
  218.     if (data != NULL)
  219.     {
  220.         memcpy(str,*data,(unsigned char)(**data) + 1);
  221.         ReleaseResource(data);
  222.     }
  223.     else
  224.         str[0] = '\0';
  225.     
  226.     return str;
  227. }
  228.  
  229.  
  230.  
  231.  
  232.  
  233. char *GetIndCString(char *str,short strListID,short index)
  234. {
  235.     return ptocstr(str,(StringPtr)GetIndPString((StringPtr)str,strListID,index));
  236. }
  237.  
  238.  
  239.  
  240.  
  241.  
  242. StringPtr GetIndPString(StringPtr str,short strListID,short index)
  243. {
  244.     GetIndString(str,strListID,index);
  245.     return str;
  246. }
  247.  
  248.  
  249.  
  250.  
  251.  
  252. char *GetAppNameCString(char *name)
  253. {
  254.     return ptocstr(name,(StringPtr)GetAppNamePString((StringPtr)name));
  255. }
  256.  
  257.  
  258.  
  259.  
  260.  
  261. StringPtr GetAppNamePString(StringPtr name)
  262. {
  263.     FCBPBRec    fpb;
  264.     
  265.     
  266.     fpb.ioCompletion = NULL;
  267.     fpb.ioFCBIndx = 0;
  268.     fpb.ioVRefNum = 0;
  269.     fpb.ioRefNum = CurResFile();
  270.     fpb.ioNamePtr = name;
  271.     PBGetFCBInfoSync(&fpb);
  272.     return name;
  273. }
  274.